package com.star.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.star.domain.*;
import com.star.dto.Result;
import com.star.enums.StateEnum;
import com.star.mapper.*;
import com.star.service.UserLoginService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.star.util.ImgUtil;
import com.star.util.MD5Util;
import com.star.util.PathUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.util.Objects;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author Star
 * @since 2021-04-21
 */
@Service
public class UserLoginServiceImpl extends ServiceImpl<UserLoginMapper, UserLogin> implements UserLoginService {
    @Autowired
    private UserLoginMapper userLoginMapper;//登录表

    @Autowired
    private UserRoleMapper userRoleMapper;//用户角色表

    @Autowired
    private UserInfoMapper userInfoMapper;//用户信息表

    /**
     * 注册并登录
     *
     * @param userLogin 注册登录信息
     * @param headImg   头像
     * @return
     */
    @Override
    @Transactional
    public Result<UserLogin> userLoginRegister(UserLogin userLogin, MultipartFile headImg,String email) {
        //用户信息不能为空
        if (userLogin == null) {//用于创建用户角色表
            return new Result<UserLogin>(false, StateEnum.NULL_USERLOGIN);
        } else if (headImg == null) {//头像地址为空
            return new Result<UserLogin>(false, -1024, "图片不能为空");
        } else if (!Objects.requireNonNull(headImg.getOriginalFilename()).split("\\.")[1].equals("png") && !headImg.getOriginalFilename().split("\\.")[1].equals("jpg")) {//后缀不对
            return new Result<UserLogin>(false, -1025, "图片传递格式出现问题");
        }else if (email==null){//邮箱为空
            return new Result<UserLogin>(false, -1025, "邮箱为空");
        }
        try {
            //md5转为大写的存入数据
//            userLogin.setLogPassWord(userLogin.getLogPassWord().toUpperCase());
            //将转换密码为md5
            userLogin.setLogPassWord(MD5Util.md5(userLogin.getLogPassWord()));
            //添加登录信息 返回插入数据信息
            userLoginMapper.insert(userLogin);
            //用户角色插入 固定是顾客
            UserRole userRole = new UserRole();
            userRole.setRoleId(3);//默认初始为顾客
            userRole.setLogId(userLogin.getLogId());//刚刚添加的登录信息编号
            //插入用户角色数据
            int userRoleId = userRoleMapper.insert(userRole);
            //插入用户信息
            UserInfo userInfo = new UserInfo();
            //存储图片地址
            String imgAddr = addUserInfoImg(userLogin, headImg);
            //添加用户信息
            userInfo.setInfoHeadUrl(imgAddr);
            userInfo.setLogId(userLogin.getLogId());
            userInfo.setInfoEmail(email);
            userInfoMapper.insert(userInfo);


        } catch (Exception e) {
            throw new RuntimeException("addUserLogin error"+e.getMessage());
        }
        return new Result<>(true,"注册用户成功");
    }

    /**
     * 判断登录名是否唯一
     * @param logAccount 登录名
     * @return 对象
     */
    @Override
    public Boolean ByUserLoginName(String logAccount) {
        //创建对象
        QueryWrapper<UserLogin> queryWrapper = new QueryWrapper<>();
        //通过queryWrapper设置条件
        queryWrapper.select("log_account").eq("log_account",logAccount);
        UserLogin userLogin = userLoginMapper.selectOne(queryWrapper);
        return userLogin != null;
    }

    /**
     * 判读登录名和密码
     * @param userLogin 对象
     * @return 对象
     */
    @Override
    public UserLogin LoginByNameAndPwd(UserLogin userLogin) {
       return userLoginMapper.byNameAndPws(userLogin);
    }

    /**
     * 根据ID进行查询
     * @param userLogin
     * @return
     */
    @Override
    public UserLogin LoginByLogId(UserLogin userLogin) {
        return userLoginMapper.byLoginId(userLogin);
    }

    /**
     * 获取 图片目录的相对值路径
     * @param headImg
     */
    private String addUserInfoImg(UserLogin userLogin, MultipartFile headImg) {
        //获取 图片目录的相对值路径
        String dest = PathUtil.getUserInfoImgPath(userLogin.getLogId());
        return ImgUtil.generateNormalImg(headImg, dest);
    }
}
